package com.vains.io;

import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩帮助类
 *
 * @author vains
 * @version 1.0
 * @since 2020/6/26 0:58
 **/
public class ZipUtils {

    private ZipUtils() {}

    /**
     * 压缩文件
     * @param out ZipOutputStream zip输出流
     * @param sourceFile 根目录
     * @param base 根目录
     */
    public static void compress(ZipOutputStream out, File sourceFile, String base) throws Exception {
        //如果路径为目录（文件夹）
        if(sourceFile.isDirectory()) {
            //取出文件夹中的文件（或子文件夹）
            File[] fList = sourceFile.listFiles();
            //如果文件夹为空，则只需在目的地zip文件中写入一个目录进入点
            if(ArrayUtils.isEmpty(fList)) {
                out.putNextEntry(new ZipEntry(base+"/") );
            } else {
                //如果文件夹不为空，则递归调用compress，文件夹中的每一个文件（或文件夹）进行压缩
                for (File file : fList) {
                    compress(out, file, base + "/" + file.getName());
                }
            }
        } else {
            //如果不是目录（文件夹），即为文件，则先写入目录进入点，之后将文件写入zip文件中
            out.putNextEntry( new ZipEntry(base) );
            FileInputStream fos = new FileInputStream(sourceFile);
            try (BufferedInputStream bis = new BufferedInputStream(fos)) {
                int tag;
                //将源文件写入到zip文件中
                while ((tag = bis.read()) != -1) {
                    out.write(tag);
                }
            }
            fos.close();
        }
    }

}
